package br.com.conciliador.consulta.apresentacao;

import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.List;

import javax.faces.event.ActionEvent;

import br.com.conciliador.cadastro.negocio.BandeiraNgc;
import br.com.conciliador.cadastro.negocio.EstLojaNgc;
import br.com.conciliador.cadastro.negocio.ProdutoNgc;
import br.com.conciliador.cadastro.vo.BandeiraVo;
import br.com.conciliador.cadastro.vo.EstLojaVo;
import br.com.conciliador.cadastro.vo.ProdutoVo;
import br.com.conciliador.consulta.negocio.ConsultaTaxasAdministracaoNgc;
import br.com.conciliador.consulta.vo.ConsultaTaxasAdministracaoVo;
import br.com.conciliador.consulta.vo.filtro.FiltroConsultaTaxasAdministracaoVo;
import br.com.conciliador.util.jsf.AbstractBean;
import br.com.r2.exception.R2Exception;
import br.com.r2.util.tipodado.Data;
import br.com.r2.util.tipodado.Flag;
import br.com.r2.util.tipodado.Moeda;
import br.com.r2.util.tipodado.Taxa;
import br.com.r2.util.tipodado.Texto;
import br.com.r2.util.tipodado.YesNo;

public class ConsultaTaxasAdministracaoBean extends AbstractBean<ConsultaTaxasAdministracaoVo, ConsultaTaxasAdministracaoNgc>
{

   private List<EstLojaVo> listaEstLojas;
   
   private List<BandeiraVo> listaBandeiras;

   private List<ProdutoVo> listaProdutos;

   private Moeda valorTotalBruto;

   private Moeda valorTotalLiquido;

   private Moeda valorTotalComissao;

   private Moeda valorTotalTaxaAdministracao;

   public ConsultaTaxasAdministracaoBean()
   {
      super(ConsultaTaxasAdministracaoNgc.getInstancia());
      this.ACTION_SEARCH = "consultaTaxasAdministracao";
      this.pageTitle = "titulo_consulta_taxas_administracao";
   }

   @Override
   protected void setListaPesquisa() throws R2Exception
   {
      setarListaEstLojas();
      setarListaBandeiras();
   }

   @Override
   public String preparaPesquisar()
   {

      String retorno = super.preparaPesquisar();
      this.getSearchObject().setFiltro(new FiltroConsultaTaxasAdministracaoVo());
      
      Data filtroData = new Data(new Date());
      this.getSearchObject().getFiltro().setDataVendaFinal(filtroData);
      filtroData = new Data(new Date());
      filtroData.add(GregorianCalendar.DAY_OF_WEEK_IN_MONTH, -1);
      this.getSearchObject().getFiltro().setDataVendaInicial(filtroData);

      return retorno;
   }
   
   @Override
   protected void validarPesquisar() throws R2Exception
   {
      if (this.getSearchObject().getFiltro() == null)
      {
         throw new R2Exception("campo_periodo_obrigatorio");
      }
      
      if (this.getSearchObject().getFiltro().getDataVendaInicial() == null
          || !this.getSearchObject().getFiltro().getDataVendaInicial().isPreenchido())
      {
         throw new R2Exception("campo_periodo_obrigatorio");
      }

   }

   private void setarListaEstLojas() throws R2Exception
   {
       this.listaEstLojas = new ArrayList<EstLojaVo>();
       EstLojaVo estLojaVo = new EstLojaVo();
       List<EstLojaVo> lista = EstLojaNgc.getInstancia().pesquisar(estLojaVo, 0);
       
       EstLojaVo vazio = new EstLojaVo();
       vazio.setDescricao(new Texto("TODAS"));
       
       this.listaEstLojas.add(vazio);
       this.listaEstLojas.addAll(lista);
   }

   private void setarListaBandeiras() throws R2Exception
   {
      this.listaBandeiras = new ArrayList<BandeiraVo>();
      BandeiraVo bandeiraVo = new BandeiraVo();
      bandeiraVo.setFlagAtivo(new Flag(YesNo.YES));
      List<BandeiraVo> lista = BandeiraNgc.getInstancia().pesquisar(bandeiraVo,0);

      BandeiraVo vazio = new BandeiraVo();
      vazio.setDescricao(new Texto("TODAS"));

      this.listaBandeiras.add(vazio);
      this.listaBandeiras.addAll(lista);
   }
   
   public void setarListaProdutos(ActionEvent event) throws R2Exception
   {
      if (this.getSearchObject().getBandeira() != null && this.getSearchObject().getBandeira().isPreenchido())
      {
         ProdutoVo produtoVo = new ProdutoVo();
         BandeiraVo bandeiraVo = new BandeiraVo();
         bandeiraVo.setCodigo(this.getSearchObject().getBandeira());
         produtoVo.setBandeiraVo(bandeiraVo);
         produtoVo.setFlagAtivo(new Flag(YesNo.YES));
         int join = ProdutoNgc.JOIN_BANDEIRA;
         List<ProdutoVo> lista = ProdutoNgc.getInstancia().pesquisar(produtoVo, join);
         
         produtoVo = new ProdutoVo();
         produtoVo.setDescricao(new Texto("TODOS"));
         this.setListaProdutos(new ArrayList<ProdutoVo>());
         this.getListaProdutos().add(produtoVo);
         if (lista != null)
         {
            this.getListaProdutos().addAll(lista);
         }
      }
   }
   
   @Override
   public void pesquisar(ActionEvent event)
   {
      super.pesquisar(event);
      double valorBruto = 0;
      double valorLiquido = 0;
      double valorComissao = 0;
      if (this.getSearchResult() != null && this.getSearchResult().size() > 0)
      {
         Iterator<ConsultaTaxasAdministracaoVo> iterator = this.getSearchResult().iterator();
         while (iterator.hasNext())
         {
            ConsultaTaxasAdministracaoVo element = (ConsultaTaxasAdministracaoVo) iterator.next();
            valorBruto += element.getValorBruto().getValor();
            valorLiquido += element.getValorLiquido().getValor();
            valorComissao += element.getValorComissao().getValor();
         }
      }
      
      valorTotalBruto = new Moeda(valorBruto);
      valorTotalLiquido = new Moeda(valorLiquido);
      valorTotalComissao = new Moeda(valorComissao);
      valorTotalTaxaAdministracao = new Moeda((100 * valorComissao) / valorTotalBruto.getValor());
   }

   public List<EstLojaVo> getListaEstLojas()
   {
      return listaEstLojas;
   }

   public void setListaEstLojas(List<EstLojaVo> listaEstLojas)
   {
      this.listaEstLojas = listaEstLojas;
   }

   public List<BandeiraVo> getListaBandeiras()
   {
      return listaBandeiras;
   }

   public void setListaBandeiras(List<BandeiraVo> listaBandeiras)
   {
      this.listaBandeiras = listaBandeiras;
   }

   public List<ProdutoVo> getListaProdutos()
   {
      return listaProdutos;
   }

   public void setListaProdutos(List<ProdutoVo> listaProdutos)
   {
      this.listaProdutos = listaProdutos;
   }

   public Moeda getValorTotalBruto()
   {
      return valorTotalBruto;
   }

   public void setValorTotalBruto(Moeda valorTotal)
   {
      this.valorTotalBruto = valorTotal;
   }

   public Moeda getValorTotalLiquido()
   {
      return valorTotalLiquido;
   }

   public void setValorTotalLiquido(Moeda valorTotalLiquido)
   {
      this.valorTotalLiquido = valorTotalLiquido;
   }

   public Moeda getValorTotalComissao()
   {
      return valorTotalComissao;
   }

   public void setValorTotalComissao(Moeda valorTotalTaxaAdministracao)
   {
      this.valorTotalComissao = valorTotalTaxaAdministracao;
   }

   public Moeda getValorTotalTaxaAdministracao()
   {
      return valorTotalTaxaAdministracao;
   }

   public void setValorTotalTaxaAdministracao(Moeda valorTotalTaxa)
   {
      this.valorTotalTaxaAdministracao = valorTotalTaxa;
   }

}
